package org.gtesoreria

import java.text.SimpleDateFormat;
import java.util.List;

class AdelantoService {

    static transactional = true

    def adelantosPendientesPorPeriodo(Date periodo) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			eq("fechaPedido",  periodo)
			order("fechaPedido","asc")
		}
		
		return normalizarAdelantos(adelantosPendientes)
    }
	
	def adelantosPendientesPorPeriodoPorEstado(Date periodo, String estado) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			eq("fechaPedido",  periodo)
			eq("estado",  estado)
			order("fechaPedido","asc")
		}
		return normalizarAdelantos(adelantosPendientes)
		
	}
	
	def adelantosAPagarPorPeriodoPorDelegado(Date periodo, Afiliado delegado) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			eq("fechaPedido",  periodo)
			eq("entrego", delegado)
			or{
				eq("estado", Adelanto.A_DESCUENTO)
				eq("estado", Adelanto.A_PRESTAMO)
				eq("estado", Adelanto.PENDIENTE)
			}
			order("fechaPedido","asc")
		}
		return normalizarAdelantos(adelantosPendientes)
	}
	
	def adelantosAPagarPorPeriodo(Date periodo) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			eq("fechaPedido",  periodo)
			or{ 
				eq("estado", Adelanto.A_DESCUENTO)
				eq("estado", Adelanto.A_PRESTAMO)
				eq("estado", Adelanto.PENDIENTE)
			}
			order("fechaPedido","asc")
		}
		return normalizarAdelantos(adelantosPendientes)
	}
	def adelantosEntreFechasPorEstado(Date from, Date to, String estado) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			between("fechaPedido",  from,to)
			eq("estado",  estado)
			order("fechaPedido","asc")
		}
		return normalizarAdelantos(adelantosPendientes)
		
	}
	
	def adelantosEntreFechasPorEstadoSinNorm(Date from, Date to, String estado) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			between("fechaPedido",  from,to)
			eq("estado",  estado)
			order("fechaPedido","asc")
		}
	}
	def normalizarAdelantos(List adelantosPendientes){
		def adelantosResult = [:]
		for (Adelanto adelanto : adelantosPendientes) {
			if(adelantosResult.get(adelanto.afiliado)){
				def adelantoCopy = adelantosResult.get(adelanto.afiliado)
				adelantoCopy.montoTotal += adelanto.montoTotal
				adelantosResult.put(adelanto.afiliado, adelantoCopy)
						
			} else {
				def adelantoCopy = new Adelanto(afiliado:adelanto.afiliado,
					 montoTotal:adelanto.montoTotal,
					 entrego:adelanto.entrego,
					 observaciones:adelanto.observaciones,
					 fechaOtorgamiento:null,
					 fechaPago:null,
					 fechaPedido:adelanto.fechaPedido,
					 estado:adelanto.estado)
				adelantosResult.put(adelanto.afiliado, adelantoCopy)
			}
		}
		return adelantosResult.values().toList()
	}
	def updateEstadoAdelantosPorPeriodo(Date periodo, String legajo, String nuevoEstado){
		def afiliado = Afiliado.findByLegajo(legajo)
		if(!afiliado)
			return false
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			eq("fechaPedido",  periodo)
			eq("afiliado", afiliado)
			order("fechaPedido","asc")
		}
		for (Adelanto adelanto : adelantosPendientes) {
			adelanto.estado = nuevoEstado
			adelantoFlow(adelanto, nuevoEstado)
			if(!adelanto.save())
				return false
		}
		return true
	}
	
	def updateEstados(List adelantos, String nuevoEstado){
		for(Adelanto adelanto in adelantos){
			adelanto.estado = nuevoEstado
			adelanto.save(flush:true)
		}
	}
	
	def updateEstadoAdelantosPorPeriodo(Date from, Date to, String idAfiliado, String nuevoEstado){
		def afiliado = Afiliado.get(idAfiliado)
		if(!afiliado)
			return false
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			between("fechaPedido",  from, to)
			eq("afiliado", afiliado)
			order("fechaPedido","asc")
		}
		for (Adelanto adelanto : adelantosPendientes) {
			adelanto.estado = nuevoEstado
			adelantoFlow(adelanto, nuevoEstado)
			if(!adelanto.save())
				return false
		}
		return true
	}
	
	boolean adelantoFlow(Adelanto adelanto, String nuevoEstado) {
		if(nuevoEstado == Adelanto.A_PRESTAMO){
			
			
		} else if(nuevoEstado == Adelanto.RECHAZADO){
			
		
		
		} else if(nuevoEstado == Adelanto.OTORGADO){
		
		
		
		}
	}
	
	def getSubTotal(List<Adelanto> adelantos){
		Double result = 0;
		for (Adelanto adelanto : adelantos) {
			result += adelanto.montoTotal;
		}
		return result;
	}
	
	def adelantosPorEstado(String estado) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query {
			eq("estado",  estado)
			order("fechaPedido","asc")
		}
		
	}
	
	def afiliadosConAdelantosEnEstado(String estado) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query.listDistinct() {
			eq("estado",  estado)
			order("fechaPedido","asc")
			projections {
				property("afiliado")
			}
		}
	}
	
	def adelantosEnEstado(Afiliado afiliado, String estado) {
		def query = Adelanto.createCriteria()
		def adelantosPendientes = query.listDistinct() {
			eq("estado",  estado)
			eq("afiliado", afiliado)
			order("fechaPedido","asc")
		}
		
	}
	
	def getByAfiliadoAndPeriodo(Afiliado afiliado, Date periodo){
		def query = Adelanto.createCriteria()
		def adelantos = query.listDistinct() {
			eq("estado",  Adelanto.OTORGADO)
			eq("afiliado", afiliado)
			eq("fechaPedido",periodo)
			maxResults(1)
		}
		if(adelantos)
			return adelantos.get(0)
		else
			return null
	}
}
